package practica2;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Stack;


public class AnalizadorLexico  {

	public static String leerFicheroSimbolos(String nombreFichero) {
		
		String cadena = "";
		try{
            // Abrimos el archivo
            FileInputStream fstream = new FileInputStream(nombreFichero);
            // Creamos el objeto de entrada
            DataInputStream entrada = new DataInputStream(fstream);
            // Creamos el Buffer de Lectura
            BufferedReader buffer = new BufferedReader(new InputStreamReader(entrada));

            String aux = buffer.readLine();
            while (aux != null) {
                cadena += aux;
                aux = buffer.readLine();
            }
            
            // Cerramos el archivo
            entrada.close();
        }catch (Exception e){ //Catch de excepciones
            System.err.println("Ocurrio un error: " + e.getMessage());
        }

		return cadena;		
	}
	
	
	public static void leerFicheroReservadas(String nombreFichero, ArrayList<String> array) {
		try{
            // Abrimos el archivo
            FileInputStream fstream = new FileInputStream(nombreFichero);
            // Creamos el objeto de entrada
            DataInputStream entrada = new DataInputStream(fstream);
            // Creamos el Buffer de Lectura
            BufferedReader buffer = new BufferedReader(new InputStreamReader(entrada));

            String cadena = buffer.readLine();
            while (cadena != null) {
            	array.add(cadena);
                cadena = buffer.readLine();
            }
            
            // Cerramos el archivo
            entrada.close();
        }catch (Exception e){ //Catch de excepciones
            System.err.println("Ocurrio un error: " + e.getMessage());
        }	
	}
	
	
	public static boolean comprobarSimbolo (char caract, String simb) {
		if (simb.indexOf(caract) != -1)
			return true;
		else
			return false;
	}
	
	public static boolean comprobarReservada (String cadena, ArrayList<String> array) {
		if (array.contains(cadena))
			return true;
		else
			return false;
	}

	
	public static int AnalisisLexico (String simb, ArrayList<String> reserv, Stack<Integer> bloq,
			String nombreFichero) {
		try{
            // Abrimos el archivo
            FileInputStream fstream = new FileInputStream(nombreFichero);
            // Creamos el objeto de entrada
            DataInputStream entrada = new DataInputStream(fstream);
            // Creamos el Buffer de Lectura
            BufferedReader buffer = new BufferedReader(new InputStreamReader(entrada));

            String linea = buffer.readLine();
            int contadorFichero = 1;
            while (linea != null) {
            	String cadenaAux = "";
            	StringReader sr = new StringReader(linea);
            	int contadorLinea = 1;
            	while (contadorLinea <= linea.length()) {
            		char caracter = (char) sr.read();
            		if ((caracter != '\n') && (caracter != '\t')) {
	            		if (comprobarSimbolo(caracter, simb)) {
	            			if (Character.isLetter(caracter)) {
	            				cadenaAux += caracter;
	            			}
	            			else if (caracter == '{') {
	    						bloq.push(contadorFichero);
	            			}
	    					else if (caracter == '}') {
//	    						if (!bloq.empty())
	    							System.out.println("Encontrada estructura {} en las lineas: ["
	    									+bloq.pop()+","+contadorFichero+"]");
//	    						else
//	    							return -2;
	    					}
	            			else {
	            				if (comprobarReservada(cadenaAux, reserv)) {
	            					System.out.println("Encontrada palabra reservada \""+cadenaAux
	            							+"\" en la linea:"+contadorFichero);
	            				}
	        					cadenaAux = "";
	            			}
	            		}
	            		else
	            			return -1;
            		}
            		contadorLinea++;
            	}
            	
                linea = buffer.readLine();
                contadorFichero++;
            }
            
            // Cerramos el archivo
            entrada.close();
        }catch (Exception e){ //Catch de excepciones
            System.err.println("Ocurrio un error: " + e.getMessage());
        }
		return 0;
	}
	
	
    public static void main(String args[]) {
    	
    	String Simbolos = "";
    	ArrayList<String> Reservadas = new ArrayList<String>(); 
    	Stack<Integer> Bloques = new Stack<Integer>();
    	
    	Simbolos = leerFicheroSimbolos("simbolos");
    	leerFicheroReservadas("palabras_reservadas", Reservadas);
    	
    	int valorError = 0;
    	valorError = AnalisisLexico(Simbolos, Reservadas, Bloques, "prueba2");

//    	if ((valorError != -2) && (!Bloques.empty()))
//    		valorError = -2;
    	
    	//System.out.println("\n\n");
    	//valor = -1 se encontro un simbolo que no existe en nuestro conjunto de caracteres
    	//valor = -2 se ha detectado un error en un bloque
    	if (valorError == -1)
    		System.err.println("ERROR: Se encontro un simbolo erroneo.");
    	else if (valorError == -2)
    		System.err.println("ERROR:Se ha detectado un error de bloque.");
    	else
    		System.out.println("FIN DEL ANALISIS: Se ha comprobado el fichero y es lexicamente correcto.");
    	

    }
}
